import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 数据加载与检查
try:
    data = pd.read_csv('D:\wenjian\py\pythonProject\mmw1\data\\train.csv')
    print('数据读取成功')
except Exception as e:
    print(f'数据读取失败: {e}')
    raise

print(data.info())
print(data.describe())
print(data.isnull().sum())
print(data.head())

# 缺失值处理（如有）
if data.isnull().sum().sum() > 0:
    data = data.fillna(data.median(numeric_only=True))
    print('已用中位数填充数值型缺失值')

# 可视化函数封装

def plot_bar(ax, group, title, xlabel, ylabel, color):
    ax.bar(group.index.astype(str), group.values, color=color)
    ax.set_title(title)
    ax.set_xlabel(xlabel)
    ax.set_ylabel(ylabel)
    ax.tick_params(axis='x', rotation=45)

def plot_pie(ax, group, title):
    ax.pie(group.values, labels=group.index.astype(str), autopct='%1.1f%%')
    ax.set_title(title)

# 直方图
data.hist(bins=30, figsize=(20, 15))
plt.tight_layout()
plt.show()

# 多子图可视化
fig = plt.figure(figsize=(30, 15))

# 各年龄段的离职率
ax1 = fig.add_subplot(421)
data['AgeBin'] = pd.cut(data['Age'], bins=10)
grouped_age = data.groupby('AgeBin')['Attrition'].mean()
plot_bar(ax1, grouped_age, '各年龄段的离职率', '年龄段', '平均离职率', 'skyblue')

# 不同工作满意度下的离职率
ax2 = fig.add_subplot(422)
grouped_satisfaction = data.groupby('JobSatisfaction')['Attrition'].mean()
plot_bar(ax2, grouped_satisfaction, '不同工作满意度下的离职率', '工作满意度评分', '平均离职率', 'salmon')

# 不同月收入区间的离职率
ax3 = fig.add_subplot(423)
data['IncomeRange'] = pd.cut(data['MonthlyIncome'], bins=range(0, int(data['MonthlyIncome'].max()) + 2000, 2000))
grouped_income = data.groupby('IncomeRange')['Attrition'].mean()
plot_bar(ax3, grouped_income, '不同月收入区间的离职率', '月收入区间（元）', '平均离职率', 'lightgreen')

# 不同教育程度下的离职率
ax4 = fig.add_subplot(424)
grouped_education = data.groupby('Education')['Attrition'].mean()
plot_bar(ax4, grouped_education, '不同教育程度下的离职率', '教育程度', '平均离职率', 'lightcoral')

# 不同性别的离职率
ax5 = fig.add_subplot(425)
grouped_gender = data.groupby('Gender')['Attrition'].mean()
plot_bar(ax5, grouped_gender, '不同性别的离职率', '性别', '平均离职率', 'lightblue')

# 不同婚姻状况的离职率
ax6 = fig.add_subplot(426)
grouped_marital = data.groupby('MaritalStatus')['Attrition'].mean()
plot_pie(ax6, grouped_marital, '不同婚姻状况的离职率')

# 不同加班状况的离职率
ax7 = fig.add_subplot(427)
grouped_overtime = data.groupby('OverTime')['Attrition'].mean()
plot_bar(ax7, grouped_overtime, '不同加班状况的离职率', '加班状况', '平均离职率', 'lightpink')

# 不同出差频率的离职率
ax8 = fig.add_subplot(428)
grouped_travel = data.groupby('BusinessTravel')['Attrition'].mean()
plot_bar(ax8, grouped_travel, '不同出差频率的离职率', '出差频率', '平均离职率', 'orange')

plt.tight_layout()
plt.savefig('D:\wenjian\py\pythonProject\mmw1\lh\log\离职率分析图.png')
plt.show()





